home *** CD-ROM | disk | FTP | other *** search
- #!/usr/bin/python
-
- from Tkinter import *
- import string
- import sys
- import telnetlib
- import string
- import re
-
- HOST = "64.81.5.201"
- USER = "foo"
- PASS = "bar"
-
-
-
-
- CurentBoss = ""
- reg_names = ["",
- "R0 ",
- "SP ",
- "TOC ",
- "R3 ",
- "R4 ",
- "R5 ",
- "R6 ",
- "R7 ",
- "R8 ",
- "R9 ",
- "R10 ",
- "R11 ",
- "R12 ",
- "R13 ",
- "R14 ",
- "R15 ",
- "R16 ",
- "R17 ",
- "R18 ",
- "R19 ",
- "R20 ",
- "R21 ",
- "R22 ",
- "R23 ",
- "R24 ",
- "R25 ",
- "R26 ",
- "R27 ",
- "R28 ",
- "R29 ",
- "R30 ",
- "R31 ",
- "PC ",
- "ps",
- "CR ",
- "LR ",
- "CTR ",
- "xer "]
-
-
- # This is a two machine debugger
-
- class App(Frame):
- match = re.compile("\033\\[([0-9]*)C")
- match_reg = re.compile("0x([0-9,a-f]*)")
- def __init__(self, master):
- Frame.__init__(self, master)
-
- self.master = master
- self.pc = ""
- self.LIST_CMD = "disas $pc $pc+20\n"
-
- self.input_data = ""
- self.incommand = 0
- self.registers = Text(width=12,height=37,borderwidth=1,
- takefocus="off",relief = RIDGE)
- self.registers.grid(row=0,column=0,rowspan=3)
- self.registers.insert(END,"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n")
-
- self.history = Text(width=80,height=30,borderwidth=1,relief = RIDGE)
- self.history.grid(row=0,column=1)
- self.history.insert(END,"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nMacHacksBug 1.0\n\n")
- self.length = 43
-
- self.dis = Text(width=80,height=5,borderwidth=1,relief = RIDGE)
- self.dis.grid(row=1,column=1)
- self.dis.insert(END,"dis")
-
- self.commands = Entry(width=80)
- self.commands.grid(row=2,column=1)
-
- # and here we get a callback when the user hits return. we could
- # make the key that triggers the callback anything we wanted to.
- # other typical options might be <Key-Tab> or <Key> (for anything)
- self.commands.bind('<Key-Return>', self.issue_command)
- self.connected = 0
-
-
- ######################################################################
-
- def connect(self):
-
- PROMPT = "$"
- self.tn = telnetlib.Telnet()
- # self.tn.set_debuglevel(4)
- self.tn.open(HOST)
- self.tn.read_until("login: ")
- self.tn.write(USER + "\n")
- self.tn.read_until("Password")
- self.tn.write(PASS + "\n")
- self.tn.read_until(PROMPT)
- # Linux
- self.tn.write("export TERM=vt100\n")
- self.tn.read_until(PROMPT)
- self.tn.write("screen -x\n")
-
- (match, junk, result) = self.tn.expect([r"\(gdb\)",(r"\$ ")])
-
- if ( -1 != string.find(result,"no screen to be attached")):
- # start a new screen sessions
- self.tn.write("screen\n")
- result = self.tn.read_until(PROMPT)
-
- if ( match == 1 ):
- self.tn.write("gdb\n")
- result = self.tn.read_until("(gdb)")
-
-
- self.tn.write("set height 0\n")
- result = self.tn.read_until("(gdb) ")
-
- self.connected = 1
-
- while 1:
- (match, junk, result) = self.tn.expect([r"\(gdb\)"],1)
- if match == -1:
- break
-
- self.tn.write("set confirm no\n")
-
- self.poll()
-
- ######################################################################
-
- def connect_X(self):
- PROMPT = "%"
- self.tn = telnetlib.Telnet()
- # self.tn.set_debuglevel(4)
- self.tn.open(HOST)
- self.tn.read_until("login: ")
- self.tn.write(USER + "\n")
- self.tn.read_until("Password")
- self.tn.write(PASS + "\n")
- self.tn.read_until(PROMPT)
- # OS X
- self.tn.write("setenv TERM vt100\n")
- self.tn.read_until(PROMPT)
- self.tn.write("screen -x\n")
-
- (match, junk, result) = self.tn.expect([r"\(gdb\)",(r"\% ")])
-
- if ( -1 != string.find(result,"no screen to be attached")):
- # start a new screen sessions
- self.tn.write("screen\n")
- result = self.tn.read_until(PROMPT)
-
- if ( match == 1 ):
- self.tn.write("gdb\n")
- result = self.tn.read_until("(gdb)")
-
-
- self.tn.write("set height 0\n")
- result = self.tn.read_until("(gdb) ")
-
- self.connected = 1
-
- while 1:
- (match, junk, result) = self.tn.expect([r"\(gdb\)"],1)
- if match == -1:
- break
-
- self.tn.write("i reg\n" +
- "list *$pc\n")
- self.poll()
-
- ######################################################################
-
- def poll(self):
-
- temp = self.tn.read_eager()
-
-
- if temp != '':
- self.input_data = self.input_data + temp
-
- result = string.find(self.input_data,"(gdb) ")
- if (result != -1):
- self.process_command(self.input_data[0:result])
- self.input_data = self.input_data[result+6:]
- else:
- result = string.find(self.input_data,"(y or n)")
- if (result != -1):
- self.process_command(self.input_data)
- self.input_data = ""
-
-
- self.master.after(5, self.poll)
-
-
- ######################################################################
-
- def do_registers(self, lines):
- old_lines = string.split(self.registers.get("1.0",END), "\n")
- self.registers.delete("1.0",END)
- j = 0;
- if lines[1][1:3] == "r0":
- for i in [33,35,36,37]+range(0,33) :
- if reg_names[i] == "":
- self.registers.insert(END,"\n")
- else:
- result = App.match_reg.search(lines[i])
- temp = result.group(1)
- reg = "0"*(8-len(temp))+temp
- if reg_names[i] == "PC ":
- self.pc = reg
-
- reg = reg_names[i]+reg
- # if old_lines[j] != reg:
- # pass
-
- self.registers.insert(END,reg+"\n")
- j = j + 1
- else:
- self.pc = ""
- self.registers.insert(END,"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n")
-
-
-
- ######################################################################
-
- def update_list(self, lines):
- self.dis.delete("1.0",END)
-
- if self.pc != "":
- for i in [1,7,8,9,10]:
- if (len(lines)>i):
- self.dis.insert(END,self.cleanup_line(lines[i]))
- self.dis.see(END)
-
- ######################################################################
-
- def update_asm_list(self, lines):
- self.dis.delete("1.0",END)
-
- if self.pc != "":
- for i in [1,2,3,4,5]:
- if (len(lines)>i):
- self.dis.insert(END,self.cleanup_line(lines[i]))
- self.dis.see(END)
-
- ######################################################################
-
- def do_floats(self, lines):
- pass
-
-
- ######################################################################
-
- def cleanup_line(self, line):
- while 1:
- result = App.match.search(line)
- if result == None:
- break
-
- r = " "*string.atoi(result.group(1))
-
- line = App.match.sub(r,line)
- return line
-
-
- ######################################################################
-
- def write_line(self, line):
- if (line == "(gdb) "):
- pass
- else:
- line = self.cleanup_line(line)
- self.history.insert(END,line)
-
-
- ######################################################################
-
- def process_command(self, block):
- lines = string.split(block, "\r")
-
- if lines[0][0:1] == "\n":
- lines[0] = lines[0][1:END]
-
- if lines[0] == "i reg":
- self.do_registers(lines)
- elif lines[0][0:7] == "#update":
- self.issue_update()
- elif lines[0][0:4] == "#asm":
- self.LIST_CMD = "disas $pc $pc+20\n"
- elif lines[0][0:4] == "#src":
- self.LIST_CMD = "list *$pc\n"
- elif (lines[0] == "stepi")or(lines[0] == "nexti"):
- self.LIST_CMD = "disas $pc $pc+20\n"
- self.history.insert(END,self.dis.get("3.0","3.end")+"\n")
- elif (lines[0] == "step")or(lines[0] == "next"):
- self.LIST_CMD = "list *$pc\n"
- self.history.insert(END,self.dis.get("3.0","3.end")+"\n")
- elif lines[0][0:9] == "list *$pc":
- self.update_list(lines)
- elif lines[0][0:9] == "disas $pc":
- self.update_asm_list(lines)
- elif lines[0] == "i float":
- self.do_floats
- elif lines[0] == "set height 0":
- pass
- else:
- # echo to screen
- for i in lines:
- self.write_line(i)
- self.history.see(END)
-
-
- ######################################################################
-
- def issue_update(self):
- self.tn.write("i reg\n" + self.LIST_CMD)
-
-
- ######################################################################
-
- def issue_list(self):
- if self.pc != "":
- self.tn.write("list 0x"+self.pc+"\n")
- else:
- self.dis.erase("0.1",END)
-
- ######################################################################
-
- def strip_our_commands(self, line):
- if line == "next":
- self.tn.write("next\n" +
- "i reg\n" +
- "list *$pc\n")
- elif line == "nexti":
- self.tn.write("nexti\n" +
- "i reg\n" +
- "disas $pc $pc+20\n")
- elif line == "t":
- if self.LIST_CMD[0:4] == "list":
- self.tn.write("next\n" +
- "i reg\n" +
- self.LIST_CMD)
- else:
- self.tn.write("nexti\n" +
- "i reg\n" +
- self.LIST_CMD)
- elif line == "step":
- self.tn.write("step\n" +
- "i reg\n" +
- "list *$pc\n")
- elif line == "stepi":
- self.tn.write("stepi\n" +
- "i reg\n" +
- "disas $pc $pc+20\n")
- elif line == "s":
- if self.LIST_CMD[0:4] == "list":
- self.tn.write("step\n" +
- "i reg\n" +
- self.LIST_CMD)
- else:
- self.tn.write("stepi\n" +
- "i reg\n" +
- self.LIST_CMD)
-
- elif line == "il": # list from PC
- self.tn.write("disassemble $pc $pc+0x20\n")
- elif line == "ip": # list around PC
- self.tn.write("disassemble $pc-0x10 $pc+0x10\n")
- elif line == "ils": # list from PC
- self.tn.write("list *$pc\n")
- elif line == "ips": # list around PC
- self.tn.write("list *$pc\n")
- elif line == "sc":
- self.tn.write("backtrace\n" +
- "i reg\n" +
- self.LIST_CMD)
- elif line == "run":
- self.tn.write("run\n" +
- "i reg\n" +
- self.LIST_CMD)
- elif line == "kill":
- self.tn.write("kill\n" +
- "i reg\n" +
- self.LIST_CMD)
- elif line == "asm":
- self.tn.write("#asm\n")
- self.tn.write("disas $pc $pc+20\n")
- elif line == "src":
- self.tn.write("#src\n")
- self.tn.write("list *$pc\n")
- else:
- self.tn.write(line+"\n")
-
- ######################################################################
-
- def issue_command(self, event):
- my_text = self.commands.get()
- if (my_text[0:9] == "connect_X"):
- if (self.connected):
- self.history.insert(END,"\nAlready Connected!")
- else:
- self.connect_X()
- elif (my_text[0:7] == "connect"):
- if (self.connected):
- self.history.insert(END,"\nAlready Connected!")
- else:
- self.connect()
- else:
- if self.connected:
- self.strip_our_commands(my_text)
- else:
- self.history.insert(END,"\nNot Connected!")
- self.commands.delete(0,END)
-
- root = Tk()
- app = App(root)
- root.title("Foo")
- root.mainloop()
-
-